/*
 * comandos.c
 *
 *  Created on: 24/11/2011
 *      Author: ${Petris-Normandia}
 */


#include "DiscPlanning.h"
#include "consola.h"

void comandear(char* comando, char** argumentos) {



	tregPosInicio posactualConsola;
	tregPosInicio proximoPedido;
	tregPosInicio sectorSolicitado;
	int8_t i;
	int8_t j;
	T_MENSAJE* mensajeEntrante;
	T_MENSAJE* mensajeSaliente;
	int8_t cantargs;
	float tiempoConsumido;
	int16_t cantSaltosdePista;
	int16_t cantSectoresRecorridos;
	char* datosCliente;



	i = 0;
	cantargs=0;
	mensajeSaliente=NULL;


	if (strcmp(comando, "info") == 0) {

		mensajeSaliente=generarMensaje(TIPO_INFO,0,NULL);
		enviarPorSocketUnix(descriptorSocketUnix,mensajeSaliente);
		datosCliente=(char*)malloc(7);
		leer_Socket_Unix(descriptorSocketUnix,datosCliente,7);
		mensajeEntrante=decodificarMensaje(datosCliente);
		free(datosCliente);
		memcpy(&posactualConsola.cylinder,mensajeEntrante->mensaje,2);
		memcpy(&posactualConsola.sector,mensajeEntrante->mensaje+2,2);
		printf("\nPosicion Actual: %i:%i\n", posactualConsola.cylinder,
					posactualConsola.sector);

	} else

	if (strcmp(comando, "clean") == 0) {

		char* buffer;
		uint32_t sectorLogico;
		for (sectorLogico = (uint32_t) atoi(argumentos[0]);
				sectorLogico <= (uint32_t) atoi (argumentos[1]); sectorLogico++) {

			buffer = malloc(512);
			memset(buffer,0,512);

			mensajeSaliente=mensaje_escritura(sectorLogico,0,buffer);
			enviarPorSocketUnix(descriptorSocketUnix,mensajeSaliente);
			eliminarMensaje(mensajeSaliente);
			}

	} else if (strcmp(comando, "trace") == 0) {

		while(argumentos[cantargs] != NULL){
			cantargs++;
		}

		while (argumentos[i] != NULL) {


			T_MSG_LECTURA* msg = malloc(sizeof(T_MSG_LECTURA));
				msg->id_pedido =(cantargs);
				msg->sector = (uint32_t)atoi(argumentos[i]);
			mensajeSaliente=generarMensaje(TIPO_CONSOLE,sizeof(T_MSG_LECTURA),msg);

			enviarPorSocketUnix(descriptorSocketUnix,mensajeSaliente);
			eliminarMensaje(mensajeSaliente);
			i++;
			}

		for (j=0;j<i;j++){
			cantSaltosdePista = 0;
			cantSectoresRecorridos = 0;
			tiempoConsumido=0;
			datosCliente=(char*)malloc(15);
			leer_Socket_Unix (descriptorSocketUnix,datosCliente,15);
			mensajeEntrante=decodificarMensaje(datosCliente);
			free(datosCliente);
			memcpy(&posactualConsola.cylinder,mensajeEntrante->mensaje,2);
			memcpy(&posactualConsola.sector,mensajeEntrante->mensaje+2,2);
			memcpy(&proximoPedido.cylinder,mensajeEntrante->mensaje+4,2);
			memcpy(&proximoPedido.sector,mensajeEntrante->mensaje+6,2);
			memcpy(&sectorSolicitado.cylinder,mensajeEntrante->mensaje+8,2);
			memcpy(&sectorSolicitado.sector,mensajeEntrante->mensaje+10,2);

			printf("\nPosicion Actual: %i:%i\n", posactualConsola.cylinder,
					posactualConsola.sector);
			printf("Sector Solicitado: %i:%i\n", sectorSolicitado.cylinder,
					sectorSolicitado.sector);
			printf("Sectores Recorridos:");
			mostrarRecorrido(&sectorSolicitado, posactualConsola, &cantSaltosdePista,
					&cantSectoresRecorridos);
			tiempoConsumido = ((cantSaltosdePista * parametros->seekTime )+ (cantSectoresRecorridos * sectorTime));
			printf("\nTiempo Consumido:%fms\n", tiempoConsumido);
			if (proximoPedido.cylinder!=24672){
			printf("Proximo Pedido: %i:%i\n", proximoPedido.cylinder,
					proximoPedido.sector);
			}
			else{
				printf("Proximo Pedido: -:-\n");
			}
			eliminarMensaje(mensajeEntrante);


		}

	}
	else if (strcmp(comando, "exit") == 0){
		exit(0);
	}

}





